﻿// owner 蒋家伟

#include "UnitTestManager.h"

// std
#include <ctime>

#include "StringUtils.h"
#include "UnitTestDbgWarnDefine.h"

using namespace jsdk;

// 开启单元测试，不开启则注释此宏
#define UNIT_TEST

jsdk::UnitTestManager & jsdk::UnitTestManager::get()
{
    static UnitTestManager s_UnitTestManager;
    return s_UnitTestManager;
}

void jsdk::UnitTestManager::registerTestFunction(const ClassId classId, const UnitTestFunction & unitTestFunction)
{
#ifdef UNIT_TEST
    UNIT_TEST_DBG_WARN_AND_RETURN_VOID_UNLESS(unitTestFunction.operator bool(), L"注册了一个无效的单元测试函数", L"蒋家伟", L"2023-10-08");
    bool success = m_classIdToUnitTestFunctionMap.insert(std::make_pair(std::string(classId), unitTestFunction)).second;
    UNIT_TEST_DBG_WARN_AND_RETURN_VOID_UNLESS(success, L"重复注册一个单元测试的类型 : " + StringUtils::toWString(classId), L"蒋家伟", L"2023-10-08");
#endif
}

bool jsdk::UnitTestManager::start() const
{
#ifdef UNIT_TEST
    UNIT_TEST_DBG_WARN(L"单元测试开始", L"蒋家伟", L"2023-10-10");
    for (const auto& iter : m_classIdToUnitTestFunctionMap)
    {
        UNIT_TEST_DBG_WARN_AND_CONTINUE_UNLESS(iter.second.operator bool(), L"注册了一个无效的单元测试函数", L"蒋家伟", L"2023-10-08");
        std::wstring str = StringUtils::toWString(iter.first);
        UNIT_TEST_DBG_WARN(str + L"单元测试开始", L"蒋家伟", L"2023-10-10");
        clock_t startTime = clock();
        if (!iter.second())
        {
            
            str += L" 单元测试失败";
            UNIT_TEST_DBG_WARN_AND_CONTINUE_UNLESS(false, str, L"蒋家伟", L"2023-10-08");
        }
        else
        {
            str += L" 单元测试成功, 消耗时间 : " + StringUtils::toWString(clock() - startTime) + L" ms";
            UNIT_TEST_DBG_WARN(str, L"蒋家伟", L"2023-10-10");
        }
    }
    UNIT_TEST_DBG_WARN(L"单元测试结束", L"蒋家伟", L"2023-10-10");
    return true;
#endif
    return false;
}

jsdk::UnitTestManager::UnitTestManager()
{
}

jsdk::UnitTestManager::~UnitTestManager()
{
}
